home *** CD-ROM | disk | FTP | other *** search
- /*
- File: CMSU.cpp
-
- Contains: Implementation CMStorageUnit class.
-
- Owned by: Vincent Lo
-
- Copyright: © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <6> 8/13/96 DM 1371929: prevent scope id from being
- smashed in CloneInto()
- <5> 7/25/96 DH Fixed NewCMxx methods to check the
- somClassReference allocation and throw if
- null (No bug #, approved by Bern).
- <4> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
- <2> 3/29/96 DM 1296171: suppress fatal container error in
- IsValidStorageUnitRef()
-
- To Do:
- In Progress:
-
- */
-
- #define CMStorageUnit_Class_Source
- #define VARIABLE_MACROS
- #include <CMSU.xih>
-
- #ifndef SOM_CMStorageUnitRefIterator_xh
- #include <CMSURefI.xh>
- #endif
-
- #ifndef _BENTODEF_
- #include "BentoDef.h"
- #endif
-
- #ifndef SOM_ODStorageUnitCursor_xh
- #include <SUCursor.xh>
- #endif
-
- #ifndef SOM_ODStorageUnitView_xh
- #include <SUView.xh>
- #endif
-
- #ifndef SOM_CMDraft_xh
- #include <CMDraft.xh>
- #endif
-
- #ifndef SOM_CMDocument_xh
- #include <CMDoc.xh>
- #endif
-
- #ifndef SOM_CMCtr_xh
- #include <CMCtr.xh>
- #endif
-
- #ifndef _DRAFPRIV_
- #include "DrafPriv.h"
- #endif
-
- #ifndef __CM_API__
- #include "CMAPI.h"
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _AEHSHTBL_
- #include "AEHshTbl.h"
- #endif
-
- #ifndef _ISOSTR_
- #include "ISOStr.h"
- #endif
-
- #ifndef _TEMPOBJ_
- #include "TempObj.h"
- #endif
-
- #ifndef _ODMEMORY_
- #include "ODMemory.h"
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdProps_defined
- #include <StdProps.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdTypes_defined
- #include <StdTypes.xh>
- #endif
-
- #ifndef SOM_ODStorageSystem_xh
- #include <ODStor.xh>
- #endif
-
- #ifndef SOM_ODSession_xh
- #include <ODSessn.xh>
- #endif
-
- #ifndef _PRMRSLVR_
- #include "PrmRslvr.h"
- #endif
-
- #ifndef _SUREF_
- #include "SURef.h"
- #endif
-
- #ifndef _SUCLONE_
- #include "SUClone.h"
- #endif
-
- #ifndef _STORUTIL_
- #include <StorUtil.h>
- #endif
-
- #ifndef __STDIO__
- #include <stdio.h> // For sprintf
- #endif
-
- #ifndef _ODDEBUG_
- #include "ODDebug.h"
- #endif
-
- #ifndef _ODNEW_
- #include "ODNew.h"
- #endif
-
- #ifndef _TIME
- #include <time.h>
- #endif
-
- #ifndef _STDTYPIO_
- #include <StdTypIO.h>
- #endif
-
- #ifndef _SESSHDR_
- #include "SessHdr.h"
- #endif
-
- #pragma segment CMStorageUnit
-
- #define USE_CLONEHELPER 1
-
- //==============================================================================
- // Constants
- //==============================================================================
- #define kInitialHashTableEntries 8
- #define kHighBitMask 0x80000000
- #define kLowBitsMask 0x7FFFFFFF
-
- #if ODDebug
- // #define ODDebug_ODStorageUnit 1
- #define ODDebug_AddProperty 1
- #define ODDebug_AddValue 1
- // #define ODDebug_SUCloneHelper 1
- #endif
-
- //==============================================================================
- // Function Prototype
- //==============================================================================
-
- static ODStorageUnitView* NewODStorageUnitView(ODMemoryHeapID heapID);
- static ODStorageUnitCursor* NewODStorageUnitCursor(ODMemoryHeapID heapID);
- static CMStorageUnitRefIterator* NewCMStorageUnitRefIterator(ODMemoryHeapID heapID);
-
- #define FailIfInvalidRefCount() ASSERTM(somSelf->GetRefCount(ev) != 0, kODErrZeroRefCount, "Invalid refCount")
- #define FailIfIllegalByteArray(value) ASSERT(value != kODNULL, kODErrIllegalNullInput)
-
- inline void BREAK_AND_THROW(ODError err)
- {
- // Debugger();
- THROW(err);
- }
-
- #define ODEnterCriticalSection()
- #define ODExitCriticalSection()
-
- // Callers must call ODSessionMustHaveCMAllocReserve(container);
- static ODULong GetPropertySize(CMObject object, CMProperty property);
- static ODULong GetObjectSize(CMObject object);
-
- //==============================================================================
- // CMStorageUnit
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: AcquireDraft
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDraft* SOMLINK CMStorageUnitGetDraft(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetDraft");
-
- return _fDraft;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Acquire
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitAcquire(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Acquire");
-
- SOM_TRY
-
- parent_Acquire(somSelf, ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Release
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitRelease(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Release");
-
- SOM_TRY
-
- CMStorageUnit_parent_ODStorageUnit_Release(somSelf, ev);
- if (somSelf->GetRefCount(ev) == 0) {
- if (_fCurValue != kODNULL) {
- CMContainer cmContainer = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
-
- CMReleaseValue(_fCurValue);
-
- _fCurValue = kODNULL;
- }
- _fCurProperty = kODNULL;
- _fDraft->ReleaseStorageUnit(ev, _fID);
- }
-
- SOM_CATCH_ALL
-
- ODError err = ErrorCode();
-
- WARN("Error occurred in ODStorageUnit::Release: %d %s", err, ErrorMessage());
-
- if (err == kODErrBentoErr)
- SetErrorCode(kODErrFatalContainerError);
- else if (err != kODErrFatalContainerError)
- SetErrorCode(kODNoError);
-
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Purge
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSize SOMLINK CMStorageUnitPurge(CMStorageUnit *somSelf, Environment *ev,
- ODSize size)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Purge");
-
- ODULong runningTotal = 0; ODVolatile( runningTotal );
-
- SOM_TRY
-
- ODBoolean hasReserve = kODFalse;
-
- if (_fCurValue != kODNULL) {
- CMContainer cmContainer = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
- hasReserve = kODTrue;
-
- CMReleaseValue(_fCurValue);
- _fCurValue = kODNULL;
- }
-
- _fCurProperty = kODNULL;
-
- if (_fObject != kODNULL) {
-
- IDList* idList = ((CMDraft*) somSelf->GetDraft(ev))->GetIDList(ev);
- ASSERT(idList != kODNULL, kODErrInvalidIDList);
-
- if (idList->Exists(_fID) == kODFalse) {
- if ( !hasReserve )
- {
- CMContainer cmContainer = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(cmContainer);
- hasReserve = kODTrue;
- }
- CMReleaseObject(_fObject);
- _fObject = kODNULL;
- }
- }
-
- // dh - call parent Purge method
- runningTotal += parent_Purge(somSelf, ev, size);
-
- SOM_CATCH_ALL
- WARN("Error %ld trying to purge in CMStorageUnitPurge",ErrorCode());
- SetErrorCode(kODNoError); // dh - Eat the exception; Purge should not
- // propagate it because clients function
- // fine whether memory was purged or not.
- SOM_ENDTRY
-
-
- return runningTotal;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Exists
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMStorageUnitExists(CMStorageUnit *somSelf, Environment *ev,
- ODPropertyName propertyName,
- ODValueType valueType,
- ODValueIndex valueIndex)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Exists");
-
- SOM_TRY
-
- CMContainer container = somSelf->GetCMContainer(ev);
- ODBoolean propertyFound = kODFalse;
- ODBoolean valueFound = kODFalse;
- CMProperty targetProperty;
- CMProperty property;
- CMType targetType;
- CMValue value;
- CMValue tmpValue;
- ODValueIndex index;
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- if (_fObject == kODNULL)
- return kODFalse;
-
- ODSessionMustHaveCMAllocReserve(container);
-
- if (propertyName != kODNULL) {
- targetProperty = CMRegisterProperty(container, propertyName);
- if (targetProperty == kODNULL)
- BREAK_AND_THROW(kODErrIllegalPropertyName);
- }
- else
- targetProperty = _fCurProperty;
-
- if (valueType != kODNULL) {
- targetType = CMRegisterType(container, valueType);
- if (targetType == kODNULL)
- BREAK_AND_THROW(kODErrInvalidValueType);
-
- value = CMUseValue(_fObject, targetProperty, targetType);
- if (value != kODNULL) {
- CMReleaseValue(value);
- valueFound = kODTrue;
- }
- }
- else if (valueIndex > 0) {
- index = 1;
- value = CMGetNextValue(_fObject, targetProperty, kODNULL);
- while ((value != kODNULL) && (index < valueIndex)) {
- index++;
- tmpValue = value;
- value = CMGetNextValue(_fObject, targetProperty, tmpValue);
- CMReleaseValue(tmpValue);
- }
- if (value != kODNULL) {
- CMReleaseValue(value);
- if (index == valueIndex)
- valueFound = kODTrue;
- }
- }
- else {
- if (propertyName != kODNULL) {
- property = CMGetNextObjectProperty(_fObject, kODNULL);
- while ((property != kODNULL) && (valueFound == kODFalse)) {
- if (targetProperty == property)
- valueFound = kODTrue;
- property = CMGetNextObjectProperty(_fObject, property);
- }
- }
- else
- valueFound = kODTrue;
- }
- ODSessionRestoreCMAllocReserve(container);
-
- return valueFound;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Exists
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMStorageUnitExistsWithCursor(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitCursor* cursor)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","ExistsWithCursor");
-
- SOM_TRY
-
- ODPropertyName propertyName;
- ODValueType valueType;
- ODValueIndex valueIndex;
- ODBoolean exists;
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- cursor->GetProperty(ev, &propertyName);
- cursor->GetValueType(ev, &valueType);
- cursor->GetValueIndex(ev, &valueIndex);
-
- exists = somSelf->Exists(ev, propertyName, valueType, valueIndex);
-
- ODDisposePtr(propertyName);
- ODDisposePtr(valueType);
-
- return exists;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CountProperties
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitCountProperties(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CountProperties");
-
- SOM_TRY
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- return CMCountProperties(_fObject, kODNULL);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CountValues
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitCountValues(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CountValues");
-
- ODULong numValues = 0;
-
- SOM_TRY
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- if (_fCurProperty == kODNULL)
- THROW(kODErrUnfocusedStorageUnit);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- numValues = CMCountValues(_fObject, _fCurProperty, kODNULL);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return numValues;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Focus
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitFocus(CMStorageUnit *somSelf, Environment *ev,
- ODPropertyName propertyName,
- ODPositionCode propertyPosCode,
- ODValueType valueType,
- ODValueIndex valueIndex,
- ODPositionCode valuePosCode)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Focus");
-
- SOM_TRY
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- CMProperty property = _fCurProperty;
- CMValue value = _fCurValue;
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- if (propertyName != kODNULL) {
- property = CMRegisterProperty(container, propertyName);
- if (property == kODNULL) {
- #ifdef ODDebug_ODStorageUnit
- somPrintf("Error in Focus: ID %x PID %x propertyName %s\n", somSelf->GetID(ev), _fObjectID, propertyName);
- #endif
- somSelf->CleanupAndFail(ev, kODErrIllegalPropertyName);
- }
- }
- else {
- _fHasPropertyLooped = propertyPosCode & kODPosMWrap;
- switch (propertyPosCode) {
- case kODPosUndefined:
- somSelf->CleanupAndFail(ev, kODErrUnsupportedPosCode);
- break;
- case kODPosSame:
- break;
- case kODPosAll:
- property = kODNULL;
- break;
- case kODPosFirstSib:
- property = CMGetNextObjectProperty(_fObject, kODNULL);
- if (property == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrPropertyDoesNotExist);
- break;
- case kODPosLastSib:
- property = CMGetPrevObjectProperty(_fObject, kODNULL);
- if (property == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrPropertyDoesNotExist);
- break;
- case kODPosNextSib:
- property = CMGetNextObjectProperty(_fObject, property);
- if (property == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrPropertyDoesNotExist);
- break;
- case kODPosPrevSib:
- property = CMGetPrevObjectProperty(_fObject, property);
- if (property == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrPropertyDoesNotExist);
- break;
- case kODPosFirstBelow:
- case kODPosLastBelow:
- case kODPosFirstAbove:
- case kODPosLastAbove:
- default:
- somSelf->CleanupAndFail(ev, kODErrUnsupportedPosCode);
- break;
- }
- }
-
- ODBoolean needReleaseValue = kODTrue;
-
- if (valueType != kODNULL) {
- CMType type = kODNULL;
-
- CMType targetType = CMRegisterType(container, valueType);
-
- value = CMUseValue(_fObject, property, targetType);
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrSUValueDoesNotExist);
-
- } else if (valueIndex > 0) {
- ODULong i = 1;
- CMValue tmpValue;
-
- value = CMGetNextValue(_fObject, property, kODNULL);
- while ((value != kODNULL) && (i < valueIndex)) {
- tmpValue = value;
- value = CMGetNextValue(_fObject, property, tmpValue);
- CMReleaseValue(tmpValue);
- i++;
- }
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrValueIndexOutOfRange);
- }
- else {
- _fHasValueLooped = valuePosCode & kODPosMWrap;
- switch (valuePosCode) {
- case kODPosUndefined:
- value = kODNULL;
- break;
- case kODPosAll:
- value = kODNULL;
- break;
- case kODPosFirstSib:
- value = CMGetNextValue(_fObject, property, kODNULL);
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrSUValueDoesNotExist);
- break;
- case kODPosNextSib:
- value = CMGetNextValue(_fObject, property, value);
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrSUValueDoesNotExist);
- break;
- case kODPosSame:
- needReleaseValue = kODFalse;
- break;
- case kODPosLastSib:
- value = CMGetPrevValue(_fObject, property, kODNULL);
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrSUValueDoesNotExist);
- break;
- case kODPosPrevSib:
- value = CMGetPrevValue(_fObject, property, value);
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrSUValueDoesNotExist);
- break;
- case kODPosFirstBelow:
- case kODPosLastBelow:
- case kODPosFirstAbove:
- case kODPosLastAbove:
- default:
- somSelf->CleanupAndFail(ev, kODErrUnsupportedPosCode);
- break;
- }
- }
-
- if (needReleaseValue != kODFalse)
- if (_fCurValue != kODNULL)
- CMReleaseValue(_fCurValue);
-
- _fOffset = 0;
- _fCurValue = value;
- _fCurProperty = property;
-
- ODSessionRestoreCMAllocReserve(container);
-
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Focus
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitFocusWithCursor(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitCursor* suCursor)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","FocusWithCursor");
-
- SOM_TRY
-
- ODPropertyName propertyName;
- ODValueType valueType;
- ODValueIndex valueIndex;
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- if (suCursor == kODNULL)
- BREAK_AND_THROW(kODErrIllegalNullSUCursorInput);
-
- suCursor->GetProperty(ev, &propertyName);
- suCursor->GetValueType(ev, &valueType);
- suCursor->GetValueIndex(ev, &valueIndex);
-
- somSelf->Focus(ev, propertyName,
- kODPosAll,
- valueType,
- valueIndex,
- kODPosAll);
-
- if (propertyName != kODNULL)
- ODDisposePtr(propertyName);
-
- if (valueType != kODNULL)
- ODDisposePtr(valueType);
-
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Externalize
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitExternalize(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Externalize");
-
- SOM_TRY
-
- PreserveFocus originalFocus(ev, somSelf);
-
- if (_fDirty) {
- somSelf->ResolveAllPromises(ev);
-
- if (_fSURefKeeper != kODNULL)
- _fSURefKeeper->Externalize();
-
- if (somSelf->Exists(ev, kODPropModDate, kODTime_T, 0)) {
- ODSetTime_TProp(ev, somSelf, kODPropModDate, kODTime_T, (ODTime) _fModificationDate);
- }
-
- _fDirty = kODFalse;
- }
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Internalize
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitInternalize(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Internalize");
-
- SOM_TRY
-
- if (_fObject == kODNULL) {
-
- IDList* idList = ((CMDraft*) somSelf->GetDraft(ev))->GetIDList(ev);
- ASSERT(idList != kODNULL, kODErrInvalidIDList);
-
- if (idList->Exists(_fID) != kODFalse) {
- _fObject = (CMObject) idList->Get(_fID);
- }
- else if (_fObjectID != kODNULL) {
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- _fObject = CMGetObject(container, _fObjectID);
-
- ODSessionRestoreCMAllocReserve(container);
-
- // if (_fObject == kODNULL)
- // BREAK_AND_THROW(kODErrBentoCannotNewObject);
- if (_fObject != kODNULL)
- idList->Add(_fID, _fObject);
- }
- else
- BREAK_AND_THROW(kODErrInvalidStorageUnit);
- }
-
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetID
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitID SOMLINK CMStorageUnitGetID(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetID");
-
- // Do not call fail if RefCount is zero because GetID can be called
- // from Remove where RefCount MUST be zero -pjh
- // FailIfInvalidRefCount();
-
- return _fID;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetName
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitName SOMLINK CMStorageUnitGetName(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetName");
-
- SOM_TRY
-
- FailIfInvalidRefCount();
- return ODGetISOStrProp(ev, somSelf, kODPropStorageUnitName, kODISOStr, kODNULL, kODNULL);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetName
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetName(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitName name)
- {
- // CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetName");
-
- SOM_TRY
-
- FailIfInvalidRefCount();
-
- ODSetISOStrProp(ev, somSelf, kODPropStorageUnitName, kODISOStr, name);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: AddProperty
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitAddProperty(CMStorageUnit *somSelf, Environment *ev,
- ODPropertyName propertyName)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","AddProperty");
-
- SOM_TRY
-
- #ifdef ODDebug_ODStorageUnit
- somPrintf("AddProperty %x %x %s\n", _fID, _fObjectID, propertyName);
- #endif
-
- CMContainer container = somSelf->GetCMContainer(ev);
- CMProperty property = kODNULL;
-
- FailIfInvalidRefCount();
-
- somSelf->Internalize(ev);
-
- if (propertyName == kODNULL)
- BREAK_AND_THROW(kODErrIllegalNullPropertyInput);
- if (propertyName != kODNULL) {
-
- ODSessionMustHaveCMAllocReserve(container);
-
- property = CMRegisterProperty(container,propertyName);
- if (property == kODNULL) {
- somSelf->CleanupAndFail(ev, kODErrCannotAddProperty);
- }
- else {
-
- #if ODDebug_AddProperty
- CMProperty tmpProp = kODNULL;
- do {
- ODSessionMustHaveCMAllocReserve(container); // safest once per loop
- tmpProp = CMGetNextObjectProperty(_fObject, tmpProp);
- } while ((tmpProp != kODNULL) && (tmpProp != property));
-
- if (tmpProp == property) {
- WARN("Property exists already.");
- somPrintf("propertyName %s exists already.\n", propertyName);
- }
- #endif
-
- if (_fCurValue != kODNULL) {
- CMReleaseValue(_fCurValue);
- _fCurValue = kODIDAll;
- }
- _fCurProperty = property;
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
- }
- ODSessionRestoreCMAllocReserve(container);
- }
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: AddValue
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitAddValue(CMStorageUnit *somSelf, Environment *ev,
- ODValueType type)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","AddValue");
-
- SOM_TRY
-
- CMContainer container = somSelf->GetCMContainer(ev);
- char* dummyBuffer = "";
- CMValue value;
-
- FailIfInvalidRefCount();
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
- if (type == kODNULL)
- BREAK_AND_THROW(kODErrIllegalNullValueTypeInput);
- else {
- ODSessionMustHaveCMAllocReserve(container);
-
- _fCurType = CMRegisterType(container, type);
- if (_fCurType == kODNULL)
- BREAK_AND_THROW(kODErrInvalidValueType);
- value = CMUseValue(_fObject, _fCurProperty, _fCurType);
- if (value == kODNULL) {
- value = CMNewValue(_fObject, _fCurProperty, _fCurType);
- if (value == kODNULL)
- somSelf->CleanupAndFail(ev, kODErrBentoCannotNewValue);
- CMWriteValueData(value, dummyBuffer, 0, 0);
- }
- #if ODDebug_AddValue
- else {
- WARN("Value exists already.");
- CMGlobalName propName = CMGetGlobalName(_fCurProperty);
- somPrintf("Property %s Value %s exists already.\n", propName, type);
- }
- #endif
- if (_fCurValue != kODNULL)
- CMReleaseValue(_fCurValue);
- _fCurValue = value;
- _fOffset = 0;
-
- ODSessionRestoreCMAllocReserve(container);
- }
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Remove
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitRemove(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Remove");
-
- SOM_TRY
-
- FailIfInvalidRefCount();
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- if (_fCurValue != kODNULL) {
- if ((_fPromiseResolver != kODNULL) && (_fPromiseResolver->IsSettingPromise() == kODFalse))
- _fPromiseResolver->ClearPromise(ev);
- CMDeleteValue(_fCurValue);
- _fCurValue = kODNULL;
- }
- else if (_fCurProperty != kODNULL) {
- CMDeleteObjectProperty(_fObject, _fCurProperty);
- _fCurProperty = kODNULL;
- }
- else {
- CMProperty curProperty = CMGetNextObjectProperty(_fObject, kODNULL);
- while (curProperty != kODNULL) {
- CMGlobalName name = CMGetGlobalName(curProperty);
- CMProperty property = curProperty;
- curProperty = CMGetNextObjectProperty(_fObject, curProperty);
- if (ODISOStrNCompare(name, kODBentoPrefix, ODISOStrLength(kODBentoPrefix)) != 0) {
- CMDeleteObjectProperty(_fObject, property);
- }
- }
- }
- ODSessionRestoreCMAllocReserve(container);
-
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CloneInto
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitCloneInto(CMStorageUnit *somSelf, Environment *ev,
- ODDraftKey key, ODStorageUnit* toSU, ODID scopeID)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CloneInto");
-
- SOM_TRY
-
- #ifdef USE_CLONEHELPER
- if (_fSUCloneHelper->ShouldClone(key, scopeID) != kODFalse) {
- #endif
- #ifdef ODDebug_SUCloneHelper
- somPrintf("Cloning %d in scope %d\n", somSelf->GetID(ev), scopeID);
- #endif
-
- #ifdef ODDebug_ODStorageUnit
- somPrintf("CMSU CloneInto: from %x %x to %x %x scope %x\n",
- _fID, _fObjectID, toSU->GetID(ev), ((CMStorageUnit*) toSU)->GetObjectID(ev), scopeID);
- #endif
-
- if (((CMDraft*) somSelf->GetDraft(ev))->IsValidDraftKey(ev, key) == kODFalse)
- THROW(kODErrInvalidDraftKey);
-
- FailIfInvalidRefCount();
-
- ODULong numProperties;
- ODULong numValues;
- ODULong i;
- ODULong j;
- ODPropertyName propertyName;
- CMGlobalName typeName;
- ODULong tmpSize;
- ODULong size;
- ODPtr buffer;
- ODStorageUnitCursor* originalFocus = kODNULL;
-
- somSelf->Internalize(ev);
-
- if (_fCurProperty != kODNULL)
- originalFocus = somSelf->CreateCursorWithFocus(ev);
-
- somSelf->Focus(ev, (ODPropertyName) kODNULL,
- kODPosAll,
- kODTypeAll,
- 0,
- kODPosUndefined);
-
- numProperties = somSelf->CountProperties(ev);
-
- for (i = 0; i < numProperties; i++) {
-
- somSelf->Focus(ev, (ODPropertyName) kODNULL,
- kODPosNextSib,
- kODTypeAll,
- 0,
- kODPosUndefined);
-
- propertyName = somSelf->GetProperty(ev);
-
- #if ODDebug_AddProperty
- if (toSU->Exists(ev, propertyName, kODNULL, 0) != kODFalse) {
- toSU->Focus(ev, propertyName, kODPosUndefined, kODNULL, 0, kODPosUndefined);
- }
- else
- toSU->AddProperty(ev, propertyName);
- #else
- toSU->AddProperty(ev, propertyName);
- #endif
-
- numValues = somSelf->CountValues(ev);
-
- for (j = 0; j < numValues; j++) {
-
- somSelf->Focus(ev, (ODPropertyName) kODNULL,
- kODPosSame,
- kODNULL,
- 0,
- kODPosNextSib);
-
- typeName = somSelf->GetType(ev);
-
- // Do no overrite existing values except for the storage unit type property.
- // New storage units are created with a generic storage unit type which should
- // be overwritten. The link iterators currently use the storage unit type
- // property to identify link and linkSource storage units.
- if ((ODISOStrCompare(propertyName, (const ODISOStr) kODPropStorageUnitType) == 0)
- || (toSU->Exists(ev, propertyName, typeName, 0) == kODFalse)) {
-
- #ifdef ODDebug_ODStorageUnit
- somPrintf("Copying from %x %x %s %s to %x %x\n",
- _fID, _fObjectID, propertyName, typeName, toSU->GetID(ev), ((CMStorageUnit*) toSU)->GetObjectID(ev));
- #endif
-
- #if ODDebug_AddValue
- if (toSU->Exists(ev, propertyName, typeName, 0) != kODFalse) {
- toSU->Focus(ev, propertyName, kODPosUndefined, typeName, 0, kODPosUndefined);
- }
- else
- toSU->AddValue(ev, typeName);
- #else
- toSU->AddValue(ev, typeName);
- #endif
-
- tmpSize = toSU->GetSize(ev);
- toSU->DeleteValue(ev, tmpSize);
-
- PreserveFocus* focus = new PreserveFocus(ev, somSelf);
- size = somSelf->GetSize(ev);
- delete focus;
- numValues = somSelf->CountValues(ev);
- numProperties = somSelf->CountProperties(ev);
-
- buffer = ODNewPtr(size, somSelf->GetHeap(ev));
- StorageUnitGetValue(somSelf, ev, size, (ODValue) buffer);
- StorageUnitSetValue(toSU, ev, size, (ODValue) buffer);
- ODDisposePtr(buffer);
- }
- else {
- toSU->Focus(ev, propertyName,
- kODPosUndefined,
- typeName,
- 0,
- kODPosUndefined);
- }
-
- ODStorageUnitRefIterator* iter;
- ODStorageUnitRef ref;
-
- iter = somSelf->CreateStorageUnitRefIterator(ev);
- for(iter->First(ev, ref); iter->IsNotComplete(ev) != kODFalse; iter->Next(ev, ref)) {
- if (somSelf->IsValidStorageUnitRef(ev, ref) != kODFalse) {
- ODStorageUnitID toEmbeddedID = 0;
- ODStorageUnitID containingFrameID = 0;
- ODBoolean strongClone = somSelf->IsStrongStorageUnitRef(ev, ref);
- ODStorageUnitID fromEmbeddedID = somSelf->GetIDFromStorageUnitRef(ev, ref);
-
- // Do *not* change the value of scopeID, because this will
- // interfere with the cloning of subsequent values and
- // properties. (1371928)
-
- ODID subScopeID = scopeID; // possible new scope
- if (subScopeID != 0) {
- TempODStorageUnit fromEmbeddedSU = _fDraft->AcquireStorageUnit(ev, fromEmbeddedID);
- if ((containingFrameID = ODGetWeakSURefProp(ev, fromEmbeddedSU, kODPropContainingFrame, kODWeakStorageUnitRef))
- != kODNULLID)
- {
- if (containingFrameID == subScopeID)
- subScopeID = fromEmbeddedID;
- else
- strongClone = kODFalse;
- }
- }
-
- if (strongClone != kODFalse) {
- #ifdef ODDebug_ODStorageUnit
- somPrintf("{{{ Strong Clone %x Begins\n", fromEmbeddedID);
- #endif
- toEmbeddedID = _fDraft->Clone(ev, key, fromEmbeddedID, 0, subScopeID);
- #ifdef ODDebug_ODStorageUnit
- somPrintf("}}} Strong Clone %x Ends %x\n", fromEmbeddedID, toEmbeddedID);
- #endif
- }
- else {
- #ifdef ODDebug_ODStorageUnit
- somPrintf("Begin Weak Clone from %x\n", fromEmbeddedID);
- #endif
- toEmbeddedID = _fDraft->WeakClone(ev, key, fromEmbeddedID, 0, subScopeID);
- #ifdef ODDebug_ODStorageUnit
- somPrintf("End Weak Clone from %x %x to %x %x\n", fromEmbeddedID, toEmbeddedID);
- #endif
- }
- if (toEmbeddedID != 0) {
-
- #ifdef ODDebug_ODStorageUnit
- ODPropertyName tmpPropertyName = somSelf->GetProperty(ev);
- ODValueType tmpTypeName = somSelf->GetType(ev);
- ODPropertyName tmpToPropertyName = toSU->GetProperty(ev);
- ODValueType tmpToTypeName = toSU->GetType(ev);
- somPrintf("SetStorageUnitRef: FromID %x %s %s to toID %x %s %s\n",
- fromEmbeddedID,
- tmpPropertyName,
- tmpTypeName,
- toEmbeddedID,
- tmpToPropertyName,
- tmpToTypeName);
- ODDisposePtr(tmpPropertyName);
- ODDisposePtr(tmpTypeName);
- ODDisposePtr(tmpToPropertyName);
- ODDisposePtr(tmpToTypeName);
- #endif
-
- toSU->SetStorageUnitRef(ev, toEmbeddedID, ref);
- }
- }
- }
- delete iter;
-
- ODDisposePtr(typeName);
- }
- ODDisposePtr(propertyName);
- }
-
- if (originalFocus == kODNULL)
- somSelf->Focus(ev, kODNULL, kODPosAll, kODNULL, 0, kODPosAll);
- else {
- somSelf->FocusWithCursor(ev, originalFocus);
- delete originalFocus;
- }
- #ifdef USE_CLONEHELPER
- }
- #endif
- #ifdef USE_CLONEHELPER
- #ifdef ODDebug_SUCloneHelper
- else
- somPrintf("Not cloning %d in scope %d\n", somSelf->GetID(ev), scopeID);
- #endif
- #endif
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CreateView
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitView* SOMLINK CMStorageUnitCreateView(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CreateView");
-
- SOM_TRY
-
- ODStorageUnitView* suView = kODNULL;
-
- FailIfInvalidRefCount();
-
- ODStorageUnitCursor* cursor = somSelf->CreateCursorWithFocus(ev);
-
- suView = NewODStorageUnitView(somSelf->GetHeap(ev));
- suView->InitStorageUnitView(ev, somSelf, cursor);
-
- return suView;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CreateCursor
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitCursor* SOMLINK CMStorageUnitCreateCursor(CMStorageUnit *somSelf, Environment *ev,
- ODPropertyName propertyName,
- ODValueType valueType,
- ODValueIndex valueIndex)
- {
- /* CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf); */
- CMStorageUnitMethodDebug("CMStorageUnit","CMStorageUnitCreateCursor");
-
- SOM_TRY
-
- ODStorageUnitCursor* suCursor = NewODStorageUnitCursor(somSelf->GetHeap(ev));
- suCursor->InitStorageUnitCursor(ev, propertyName, valueType, valueIndex);
-
- return suCursor;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CreateCursorWithFocus
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitCursor* SOMLINK CMStorageUnitCreateCursorWithFocus(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CreateCursorWithFocus");
-
- SOM_TRY
-
- ODStorageUnitCursor* suCursor = kODNULL;
- ODPropertyName propertyName = kODNULL;
- ODValueType valueType = kODNULL;
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- if (_fCurProperty != kODNULL)
- propertyName = somSelf->GetProperty(ev);
-
- if (_fCurValue != kODNULL)
- valueType = somSelf->GetType(ev);
-
- suCursor = NewODStorageUnitCursor(somSelf->GetHeap(ev));
- suCursor->InitStorageUnitCursor(ev, propertyName, valueType, _fCurValueIndex);
-
- ODDisposePtr(propertyName);
- ODDisposePtr(valueType);
-
- return suCursor;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetProperty
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPropertyName SOMLINK CMStorageUnitGetProperty(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetProperty");
-
- SOM_TRY
-
- CMGlobalName tmp;
- ODPropertyName propertyName = kODNULL;
-
- FailIfInvalidRefCount();
-
- if (_fCurProperty == kODNULL)
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- // CMContainer container = _fDraft->GetCMContainer(ev);
- // ODSessionMustHaveCMAllocReserve(container);
- // CMIsProperty() and CMGetGlobalName() do not allocate memory.
-
- if (CMIsProperty(_fCurProperty)) {
- tmp = CMGetGlobalName(_fCurProperty);
- propertyName = ODISOStrFromCStr(tmp);
- }
- // ODSessionRestoreCMAllocReserve(container);
-
- return (propertyName);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetType
- //------------------------------------------------------------------------------
-
- SOM_Scope ODValueType SOMLINK CMStorageUnitGetType(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetType");
-
- SOM_TRY
-
- CMType type;
- CMGlobalName tmp;
- ODValueType typeName = kODNULL;
-
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMGetValueInfo(_fCurValue, kODNULL, kODNULL, kODNULL, &type, kODNULL);
-
- if (CMIsType(type)) {
- tmp = CMGetGlobalName(type);
- typeName = ODISOStrFromCStr(tmp);
- }
- ODSessionRestoreCMAllocReserve(container);
-
- return (typeName);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetType
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetType(CMStorageUnit *somSelf, Environment *ev,
- ODValueType typeName)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetType");
-
- SOM_TRY
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- CMType type;
-
- FailIfInvalidRefCount();
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- // CMContainer container = somSelf->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- type = CMRegisterType(container, (CMGlobalName) typeName);
- if (type != kODNULL)
- CMSetValueType(_fCurValue, type);
- else
- BREAK_AND_THROW(kODErrInvalidValueType);
-
- ODSessionRestoreCMAllocReserve(container);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetOffset
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetOffset(CMStorageUnit *somSelf, Environment *ev,
- ODULong offset)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetOffset");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- THROW(kODErrUnfocusedStorageUnit);
-
- _fOffset = offset;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope ODULong SOMLINK CMStorageUnitGetOffset(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetOffset");
-
- ODULong offset = 0;
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- THROW(kODErrUnfocusedStorageUnit);
-
- offset = _fOffset;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return offset;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetValue
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitGetValue(CMStorageUnit *somSelf, Environment *ev,
- ODULong length,
- ODByteArray* value)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetValue");
-
- SOM_TRY
-
- FailIfIllegalByteArray(value);
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- if ((_fPromiseResolver != kODNULL) && (_fPromiseResolver->IsSettingPromise() == kODFalse))
- _fPromiseResolver->ResolvePromise(ev);
-
- value->_buffer = (octet*) ODNewPtr(length);
- value->_maximum = length;
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- value->_length = CMReadValueData(_fCurValue, (CMPtr) value->_buffer, _fOffset, length);
-
- ODSessionRestoreCMAllocReserve(container);
-
- _fOffset += value->_length;
-
- return value->_length;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetValue
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetValue(CMStorageUnit *somSelf, Environment *ev,
- ODByteArray* value)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetValue");
-
- SOM_TRY
-
- FailIfIllegalByteArray(value);
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- if ((_fPromiseResolver != kODNULL) && (_fPromiseResolver->IsSettingPromise() == kODFalse))
- _fPromiseResolver->ResolvePromise(ev);
-
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMWriteValueData(_fCurValue, (CMPtr) value->_buffer, _fOffset, value->_length);
-
- ODSessionRestoreCMAllocReserve(container);
-
- _fOffset += value->_length;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: InsertValue
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitInsertValue(CMStorageUnit *somSelf, Environment *ev,
- ODByteArray* value)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","InsertValue");
-
- SOM_TRY
- FailIfIllegalByteArray(value);
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- if ((_fPromiseResolver != kODNULL) && (_fPromiseResolver->IsSettingPromise() == kODFalse))
- _fPromiseResolver->ResolvePromise(ev);
-
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMInsertValueData(_fCurValue,(CMPtr) value->_buffer, _fOffset, value->_length);
-
- ODSessionRestoreCMAllocReserve(container);
-
- _fOffset += value->_length;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: DeleteValue
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitDeleteValue(CMStorageUnit *somSelf, Environment *ev,
- ODULong length)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","DeleteValue");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- if ((_fPromiseResolver != kODNULL) && (_fPromiseResolver->IsSettingPromise() == kODFalse))
- _fPromiseResolver->ResolvePromise(ev);
-
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMDeleteValueData(_fCurValue, _fOffset, length);
-
- ODSessionRestoreCMAllocReserve(container);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetSize
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitGetSize(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetSize");
-
- SOM_TRY
- ODULong size = 0;
-
- FailIfInvalidRefCount();
- somSelf->Internalize(ev);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
- // GetPropertySize() and GetObjectSize() call CM methods
-
- if (_fCurValue != kODNULL) {
- if ((_fPromiseResolver != kODNULL) && (_fPromiseResolver->IsSettingPromise() == kODFalse))
- _fPromiseResolver->ResolvePromise(ev);
-
- size = CMGetValueSize(_fCurValue);
- }
- else if (_fCurProperty != kODNULL)
- size = GetPropertySize(_fObject, _fCurProperty);
- else
- size = GetObjectSize(_fObject);
-
- ODSessionRestoreCMAllocReserve(container);
-
- return size;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetStrongStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitGetStrongStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitID embeddedSUID, ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetStrongStorageUnitRef");
-
- SOM_TRY
-
- somSelf->GetStorageUnitRef(ev, embeddedSUID, kODTrue, ref);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetWeakStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitGetWeakStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitID embeddedSUID, ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetWeakStorageUnitRef");
-
- SOM_TRY
-
- somSelf->GetStorageUnitRef(ev, embeddedSUID, kODFalse, ref);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: IsValidStorageUnitRef
- //------------------------------------------------------------------------------
-
- extern ODBoolean gODSuppressBentoFatalError; // defined in SessHdr.cpp
-
- SOM_Scope ODBoolean SOMLINK CMStorageUnitIsValidStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","IsValidStorageUnitRef");
-
- ODBoolean oldSuppress = gODSuppressBentoFatalError;
- gODSuppressBentoFatalError = kODTrue;
-
- CMObject object = kODNULL;
-
- SOM_TRY
-
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- ODVolatile(object);
- TRY
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- object = CMGetReferencedObject(_fCurValue, ref);
- if (object != kODNULL)
- CMReleaseObject(object);
-
- ODSessionRestoreCMAllocReserve(container);
- CATCH_ALL
- object = kODNULL;
- ENDTRY
-
- SOM_CATCH_ALL
- object=kODNULL;
- SOM_ENDTRY
-
- gODSuppressBentoFatalError = oldSuppress; // neutral
- return (object != kODNULL);
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: IsStrongStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMStorageUnitIsStrongStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","IsStrongStorageUnitRef");
-
- return _fSURefKeeper->IsStrongSURef(ref);
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: IsWeakStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMStorageUnitIsWeakStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","IsWeakStorageUnitRef");
-
- return _fSURefKeeper->IsWeakSURef(ref);
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: RemoveStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK CMStorageUnitRemoveStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","RemoveStorageUnitRef");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMDeleteReference(_fCurValue, ref);
-
- ODSessionRestoreCMAllocReserve(container);
-
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetIDFromStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitID SOMLINK CMStorageUnitGetIDFromStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetIDFromStorageUnitRef");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- CMObject object;
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- TRY
- object = CMGetReferencedObject(_fCurValue, ref);
- CATCH_ALL
- BREAK_AND_THROW(kODErrInvalidStorageUnitRef);
- ENDTRY
-
- if (object == kODNULL)
- BREAK_AND_THROW(kODErrInvalidStorageUnitRef);
-
- ODID id = 0;
- IDList* idList = ((CMDraft*) somSelf->GetDraft(ev))->GetIDList(ev);
- ASSERT(idList != kODNULL, kODErrInvalidIDList);
-
- if (idList->ObjectExists(object) != kODFalse) {
- id = idList->GetID(object);
- CMReleaseObject(object);
- }
- else {
- id = idList->Add(object);
- }
- ODSessionRestoreCMAllocReserve(container);
-
- return id;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CreateStorageUnitRefIterator
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitRefIterator* SOMLINK CMStorageUnitCreateStorageUnitRefIterator(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CrateStorageUnitRefIterator");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- CMStorageUnitRefIterator* iter = NewCMStorageUnitRefIterator(somSelf->GetHeap(ev));
- iter->InitStorageUnitRefIterator(ev, somSelf);
-
- return iter;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetGenerationNumber
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitGetGenerationNumber(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetGenerationNumber");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- ODULong generation = 0;
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMGetValueInfo(_fCurValue, kODNULL, kODNULL, kODNULL, kODNULL, &generation);
-
- ODSessionRestoreCMAllocReserve(container);
-
- return generation;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: IncrementGenerationNumber
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitIncrementGenerationNumber(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","IncrementGenerationNumber");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- ODULong generation = somSelf->GetGenerationNumber(ev);
- generation++;
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMSetValueGeneration(_fCurValue, generation);
-
- ODSessionRestoreCMAllocReserve(container);
-
- return generation;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetSession
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSession* SOMLINK CMStorageUnitGetSession(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetSession");
-
- SOM_TRY
-
- return (ODSession*) _fDraft->GetDocument(ev)->GetContainer(ev)->GetStorageSystem(ev)->GetSession(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: InitStorageUnit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitInitStorageUnit(CMStorageUnit *somSelf, Environment *ev,
- ODDraft* draft,ODStorageUnitID suid)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","InitStorageUnit");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fDraft = kODNULL;
- _fID = 0;
- _fObjectID = kODNULL;
- _fObject = kODNULL;
- _fCurProperty = kODIDAll;
- _fCurValueIndex = 0;
- _fCurValue = kODIDAll;
- _fCurValueType = 0;
- _fCurType = kODNULL;
- _fOffset = 0;
- _fHasPropertyLooped = kODFalse;
- _fHasValueLooped = kODFalse;
-
- _fCurrentKey = 0;
- _fLockCount = 0;
-
- _fSURefKeeper = kODNULL;
-
- #ifdef USE_CLONEHELPER
- _fSUCloneHelper = kODNULL;
- #endif
-
- _fHeap = kDefaultHeapID;
-
- _fModificationDate = 0;
- _fDirty = kODFalse;
- */
- _fCurProperty = kODIDAll;
- _fCurValue = kODIDAll;
- _fHeap = kDefaultHeapID;
-
- somSelf->InitRefCntObject(ev);
-
-
- if (draft != kODNULL) {
-
- _fDraft = (CMDraft*) draft;
- _fID = suid;
-
- IDList* idList = kODNULL;
-
- idList = _fDraft->GetIDList(ev);
- ASSERT(idList != kODNULL, kODErrInvalidIDList);
-
- _fObject = (CMObject) idList->Get(_fID);
- if (_fObject == kODNULL)
- BREAK_AND_THROW(kODErrBentoInvalidObject);
-
- _fCMContainer = _fDraft->GetCMContainer(ev);
-
- _fObjectID = CMGetObjectID(_fObject);
-
- _fHeap = _fDraft->GetHeap(ev);
-
- _fPromiseResolver = new(_fHeap) PromiseResolver;
- _fPromiseResolver->InitPromiseResolver(somSelf);
-
- _fSURefKeeper = new(_fHeap) SURefKeeper(somSelf);
-
- #ifdef USE_CLONEHELPER
- _fSUCloneHelper = new(_fHeap) SUCloneHelper;
- #endif
- }
- else
- THROW(kODErrIllegalNullDraftInput);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: ~CMStorageUnit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitsomUninit(CMStorageUnit *somSelf)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","somUninit");
-
- delete _fPromiseResolver;
- delete _fSURefKeeper;
-
- #ifdef USE_CLONEHELPER
- delete _fSUCloneHelper;
- #endif
-
- CMStorageUnit_parents_somUninit(somSelf);
-
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: CleanupAndFail
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitCleanupAndFail(CMStorageUnit *somSelf, Environment *ev,
- ODError err)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CleanupAndFail");
-
- SOM_TRY
-
- #ifdef ODDebug_ODStorageUnit
- somPrintf("Cleanup and fail: ID %x PID %x\n", somSelf->GetID(ev), _fObjectID);
- #endif
-
- if (_fCurValue != kODNULL) {
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMReleaseValue(_fCurValue);
-
- ODSessionRestoreCMAllocReserve(container);
-
- _fCurValue = kODNULL;
- }
- if (err) {
- BREAK_AND_THROW(err);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Lock
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnitKey SOMLINK CMStorageUnitLock(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitKey key)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Lock");
-
- ODEnterCriticalSection();
-
- if (key == 0) {
- if (_fLockCount == 0) {
- _fLockCount = 1;
- _fCurrentKey++;
- key = _fCurrentKey;
- }
- }
- else {
- if ((_fCurrentKey != key) || (_fLockCount == 0))
- ODSetSOMException(ev,kODErrInvalidStorageUnitKey);
- else
- _fLockCount++;
- }
-
- ODExitCriticalSection();
-
- return key;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: Unlock
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitUnlock(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitKey key)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","Unlock");
-
- ODEnterCriticalSection();
-
- if (_fCurrentKey != key)
- ODSetSOMException(ev,kODErrInvalidStorageUnitKey);
-
- else if (_fLockCount == 0)
- ODSetSOMException(ev,kODErrStorageUnitNotLocked);
-
- else
- --_fLockCount;
-
- ODExitCriticalSection();
- }
-
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitGetStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitID embeddedSUID, ODBoolean strong, ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetStorageUnitRef");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if (embeddedSUID == kODNULLID)
- THROW(kODErrIllegalNullStorageUnitInput);
-
- // Clear incoming reference
- _fSURefKeeper->InvalidateSURef(ref);
-
- CMReference theReferenceData;
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- CMStorageUnit* embeddedSU = (CMStorageUnit*) somSelf->GetDraft(ev)->AcquireStorageUnit(ev, embeddedSUID);
- TempODStorageUnit tempSU = embeddedSU; // ensure it's released
-
- if (embeddedSU) {
- CMObject object = embeddedSU->GetObject(ev);
- if (object) {
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- if (CMGetReferenceForObject(_fCurValue, object, theReferenceData) != kODNULL) {
- // we already have this object in the reference, reuse the id
- ODBlockMove(theReferenceData, ref, sizeof(CMReference));
- // if strong, value must be strong, else value must be weak
- if ((strong != kODFalse) ? somSelf->IsWeakStorageUnitRef(ev, ref) : somSelf->IsStrongStorageUnitRef(ev, ref))
- _fSURefKeeper->InvalidateSURef(ref);
- }
-
- if (somSelf->IsValidStorageUnitRef(ev, ref) == kODFalse) {
- _fSURefKeeper->GetNextSURef(ref, strong);
- // ODBlockMove(ref, theReferenceData, sizeof(CMReference));
- }
-
- // CMSetReference(_fCurValue, embeddedSU->GetObject(ev), theReferenceData);
- CMSetReference(_fCurValue, object, ref);
-
- ODSessionRestoreCMAllocReserve(container);
- }
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetStorageUnitRef
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetStorageUnitRef(CMStorageUnit *somSelf, Environment *ev,
- ODStorageUnitID embeddedSUID, ODStorageUnitRef ref)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetStorageUnitRef");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- CMReference theReferenceData;
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL) || (_fCurValue == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- if (embeddedSUID == 0)
- THROW(kODErrIllegalNullIDInput);
-
- CMStorageUnit* embeddedSU = (CMStorageUnit*) somSelf->GetDraft(ev)->AcquireStorageUnit(ev, embeddedSUID);
- TempODStorageUnit tempSU = embeddedSU;
-
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- ODBlockMove(ref, theReferenceData, sizeof(CMReference));
-
- if (_fSURefKeeper != kODNULL) {
- _fSURefKeeper->Reset(ref);
- }
-
- CMContainer container = _fDraft->GetCMContainer(ev);
- ODSessionMustHaveCMAllocReserve(container);
-
- CMSetReference(_fCurValue, embeddedSU->GetObject(ev), theReferenceData);
-
- ODSessionRestoreCMAllocReserve(container);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetHeap
- //------------------------------------------------------------------------------
-
- SOM_Scope ODMemoryHeapID SOMLINK CMStorageUnitGetHeap(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetHeap");
-
- return _fHeap;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetCMContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope CMContainer SOMLINK CMStorageUnitGetCMContainer(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetCMContainer");
-
- SOM_TRY
-
- return _fDraft->GetCMContainer(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetChangedFromPrevFlag
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetChangedFromPrevFlag(CMStorageUnit *somSelf, Environment *ev,
- ODBoolean changed)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetChangedFromPrevFlag");
-
- SOM_TRY
-
- if (_fDraft != kODNULL)
- _fDraft->SetChangedFromPrevFlag(ev, changed);
-
- time((time_t *)(&_fModificationDate));
-
- _fDirty = kODTrue;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetObjectID
- //------------------------------------------------------------------------------
-
- SOM_Scope ODID SOMLINK CMStorageUnitGetObjectID(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetObjectID");
-
- return (ODID) _fObjectID;
- }
-
- //------------------------------------------------------------------------------
- // GetPropertySize
- //------------------------------------------------------------------------------
-
- // Callers must call ODSessionMustHaveCMAllocReserve(container);
-
- static ODULong GetPropertySize(CMObject object, CMProperty property)
- {
- ODULong size = 0;
- ODULong numValues = CMCountValues(object, property, kODNULL);
- CMValue curValue = kODNULL;
-
- for (ODULong i = 0; i < numValues; i++) {
- curValue = CMGetNextValue(object, property, curValue);
- if (curValue != kODNULL) {
- size += CMGetValueSize(curValue);
- CMReleaseValue(curValue);
- }
- }
- return size;
- }
-
- //------------------------------------------------------------------------------
- // GetObjectSize
- //------------------------------------------------------------------------------
-
- // Callers must call ODSessionMustHaveCMAllocReserve(container);
-
- static ODULong GetObjectSize(CMObject object)
- {
- ODULong size = 0;
- ODULong numProperties = CMCountProperties(object, kODNULL);
- CMProperty curProperty = kODNULL;
-
- for (ODULong i = 0; i < numProperties; i++) {
- curProperty = CMGetNextObjectProperty(object, curProperty);
- size += GetPropertySize(object, curProperty);
- }
- return size;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetCurValue
- //------------------------------------------------------------------------------
-
- SOM_Scope CMValue SOMLINK CMStorageUnitGetCurValue(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetCurValue");
-
- return _fCurValue;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetCurValue
- //------------------------------------------------------------------------------
- //
- //SOM_Scope void SOMLINK CMStorageUnitSetCurValue(CMStorageUnit *somSelf, Environment *ev, CMValue curValue)
- //{
- // CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- // CMStorageUnitMethodDebug("CMStorageUnit","SetCurValue");
- //
- // _fCurValue = curValue;
- //}
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetObject
- //------------------------------------------------------------------------------
-
- SOM_Scope CMObject SOMLINK CMStorageUnitGetObject(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetCurValue");
-
- return _fObject;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetCurProperty
- //------------------------------------------------------------------------------
-
- SOM_Scope CMObject SOMLINK CMStorageUnitGetCurProperty(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetCurProperty");
-
- return _fCurProperty;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetCurType
- //------------------------------------------------------------------------------
-
- SOM_Scope CMType SOMLINK CMStorageUnitGetCurType(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","GetCurType");
-
- return _fCurType;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetCurType
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetCurType(CMStorageUnit *somSelf, Environment *ev, CMType curType)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","SetCurType");
-
- _fCurType = curType;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: IsPromiseValue
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK CMStorageUnitIsPromiseValue(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CMStorageUnitIsPromiseValue");
-
- SOM_TRY
-
- return _fPromiseResolver->IsPromiseValue(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: SetPromiseValue
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitSetPromiseValue(CMStorageUnit *somSelf, Environment *ev,
- ODValueType valueType,
- ODULong offset,
- ODByteArray* value,
- ODPart* sourcePart)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CMStorageUnitSetPromiseValue");
-
- SOM_TRY
- FailIfIllegalByteArray(value);
- FailIfInvalidRefCount();
-
- if ((_fObject == kODNULL) || (_fCurProperty == kODNULL))
- BREAK_AND_THROW(kODErrUnfocusedStorageUnit);
-
- if (_fPromiseResolver != kODNULL) {
- _fPromiseResolver->SettingPromise();
-
- TRY
- #if ODDebug_AddValue
- ODPropertyName propertyName = somSelf->GetProperty(ev);
- if (somSelf->Exists(ev, propertyName, valueType, 0) != kODFalse) {
- somSelf->Focus(ev, propertyName, kODPosUndefined, valueType, 0, kODPosUndefined);
- }
- else
- somSelf->AddValue(ev, valueType);
- ODDisposePtr(propertyName);
- #else
- somSelf->AddValue(ev, valueType);
- #endif
- somSelf->SetChangedFromPrevFlag(ev, kODTrue);
-
- somSelf->SetOffset(ev, offset);
- somSelf->SetValue(ev, value);
-
- _fPromiseResolver->SetSourcePart(ev, sourcePart);
-
- _fPromiseResolver->DoneSettingPromise();
- CATCH_ALL
- _fPromiseResolver->DoneSettingPromise();
- RERAISE;
- ENDTRY
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: GetPromiseValue
- //------------------------------------------------------------------------------
-
- SOM_Scope ODULong SOMLINK CMStorageUnitGetPromiseValue(CMStorageUnit *somSelf, Environment *ev,
- ODValueType valueType,
- ODULong offset,
- ODULong length,
- ODByteArray* value,
- ODPart** sourcePart)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CMStorageUnitGetPromiseValue");
-
- SOM_TRY
- FailIfIllegalByteArray(value);
- FailIfInvalidRefCount();
-
- somSelf->Focus(ev, kODNULL, kODPosSame, valueType, 0, kODPosSame);
-
- value->_buffer = (octet*) ODNewPtr(length);
- value->_maximum = length;
- value->_length = CMReadValueData(_fCurValue, (CMPtr) value->_buffer, offset, length);
-
- if ((_fPromiseResolver != kODNULL) && (sourcePart != kODNULL))
- *sourcePart = _fPromiseResolver->GetSourcePart(ev);
-
- return value->_length;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return 0;
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: ClearAllPromises
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitClearAllPromises(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CMStorageUnitClearAllPromises");
-
- SOM_TRY
- FailIfInvalidRefCount();
-
- if (_fPromiseResolver->GetPromiseCount())
- {
- somSelf->Focus(ev,
- (ODPropertyName) kODNULL,
- kODPosAll,
- kODTypeAll,
- 0,
- kODPosUndefined);
- ODULong numProperties = somSelf->CountProperties(ev);
- for (ODULong i = 0; i < numProperties; i++)
- {
- somSelf->Focus(ev,
- (ODPropertyName) kODNULL,
- kODPosNextSib,
- kODTypeAll,
- 0,
- kODPosUndefined);
- ODULong numValues = somSelf->CountValues(ev);
- for (ODULong j = 0; j < numValues; j++)
- {
- somSelf->Focus(ev,
- (ODPropertyName)kODNULL,
- kODPosSame,
- kODTypeAll,
- 0,
- kODPosNextSib);
- _fPromiseResolver->ClearPromise(ev);
- if (_fPromiseResolver->GetPromiseCount() == 0)
- return;
- }
- }
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // CMStorageUnit: ResolveAllPromises
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK CMStorageUnitResolveAllPromises(CMStorageUnit *somSelf, Environment *ev)
- {
- CMStorageUnitData *somThis = CMStorageUnitGetData(somSelf);
- CMStorageUnitMethodDebug("CMStorageUnit","CMStorageUnitResolveAllPromises");
-
- SOM_TRY
-
- if (_fPromiseResolver && _fPromiseResolver->GetPromiseCount())
- {
- somSelf->Focus(ev, (ODPropertyName)kODNULL,
- kODPosAll,
- kODTypeAll,
- 0,
- kODPosUndefined);
- ODULong numProperties = somSelf->CountProperties(ev);
- for (ODULong i = 0; i < numProperties; i++)
- {
- somSelf->Focus(ev, (ODPropertyName)kODNULL,
- kODPosNextSib,
- kODTypeAll,
- 0,
- kODPosUndefined);
- ODULong numValues = somSelf->CountValues(ev);
- for (ODULong j = 0; j < numValues; j++)
- {
- somSelf->Focus(ev, (ODPropertyName)kODNULL,
- kODPosSame,
- kODTypeAll,
- 0,
- kODPosNextSib);
- PreserveFocus* focus = new PreserveFocus(ev, somSelf);
- _fPromiseResolver->ResolvePromise(ev);
- delete focus;
- numValues = somSelf->CountValues(ev);
- numProperties = somSelf->CountProperties(ev);
- if (_fPromiseResolver->GetPromiseCount() == 0)
- return;
- }
- }
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // NewODStorageUnitView
- //------------------------------------------------------------------------------
-
- static ODStorageUnitView* NewODStorageUnitView(ODMemoryHeapID heapID)
- {
- SOMClass* suViewClass = somNewClassReference(ODStorageUnitView);
- THROW_IF_NULL( suViewClass );
- ODULong size = suViewClass->somGetInstanceSize();
- ODPtr buffer = ODNewPtr(size, heapID);
- ODStorageUnitView* suView = (ODStorageUnitView*) suViewClass->somRenew(buffer);
- somReleaseClassReference ( suViewClass );
-
- return suView;
- }
-
- //------------------------------------------------------------------------------
- // NewODStorageUnitCursor
- //------------------------------------------------------------------------------
-
- static ODStorageUnitCursor* NewODStorageUnitCursor(ODMemoryHeapID heapID)
- {
- SOMClass* suCursorClass = somNewClassReference(ODStorageUnitCursor);
- THROW_IF_NULL( suCursorClass );
- ODULong size = suCursorClass->somGetInstanceSize();
- ODPtr buffer = ODNewPtr(size, heapID);
- ODStorageUnitCursor* suCursor = (ODStorageUnitCursor*) suCursorClass->somRenew(buffer);
- somReleaseClassReference ( suCursorClass );
-
- return suCursor;
- }
-
- //------------------------------------------------------------------------------
- // NewCMStorageUnitRefIterator
- //------------------------------------------------------------------------------
-
- static CMStorageUnitRefIterator* NewCMStorageUnitRefIterator(ODMemoryHeapID heapID)
- {
- SOMClass* refIterClass = somNewClassReference(CMStorageUnitRefIterator);
- THROW_IF_NULL( refIterClass );
- ODULong size = refIterClass->somGetInstanceSize();
- ODPtr buffer = ODNewPtr(size, heapID);
- CMStorageUnitRefIterator* refIter = (CMStorageUnitRefIterator*) refIterClass->somRenew(buffer);
- somReleaseClassReference ( refIterClass );
-
- return refIter;
- }
-
-
-